package com.example.springboot.dbconfig;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.env.MutablePropertySources;
import org.springframework.core.env.PropertiesPropertySource;
import org.springframework.core.env.PropertySource;

import javax.annotation.PostConstruct;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Properties;
import java.util.regex.Pattern;

@Configuration
public class DatabaseProperties {


    /**
     * 声明一个对象用于存储数据库中的配置字段信息
     */
    private Properties properties = new Properties();
    /**
     * 上下文环境信息
     */
    @Autowired
    private ConfigurableEnvironment env;

    private static Pattern p = Pattern.compile("^applicationConfig.*");


    public static void main(String[] args) {
        HashMap map = new HashMap();
        HashMap y = new HashMap();
        System.out.println(map.getClass().getComponentType().isInstance(y));
    }

    /**
     * 调用并初始化数据库中的配置字段到全局对象中
     */
    @PostConstruct
    private void initProperties() {
        System.out.println("数据库表配置-->读取数据表配置服务:开始!");
        long startTime = System.nanoTime();
        MutablePropertySources propertySources = env.getPropertySources();
        try {
            HashMap<String, Object> map = new HashMap();
            map.put("ConfKey", 12345);
            map.put("ConfValue", 45321);
            List<HashMap<String, Object>> propertyMap = Arrays.asList(map);
            // 打印读取的数据表配置数据
            System.out.println(propertyMap.toString());
            // 遍历所有数据表中的数据，然后把数据添加到properties配置字段中`
            for (HashMap<String, Object> tmp : propertyMap) {
                // 把数据表中的key和value添加到环境中
                properties.put(tmp.get("ConfKey").toString(), tmp.get("ConfValue"));
            }
            PropertiesPropertySource dbPropertySource = new PropertiesPropertySource("dbPropertySource", properties);

            propertySources.addFirst(dbPropertySource);
            // 定义一个正则判断环境变量中是否存在相关的配置

            String name = null;
            boolean flag = false;
            for (PropertySource<?> source : propertySources) {
                if (p.matcher(source.getName()).matches()) {
                    name = source.getName();
                    // 表示环境中存在该环境的配置，可以退出
                    flag = true;
                    break;
                }
            }
            if (flag) {
                propertySources.addBefore(name, dbPropertySource);
            } else {
                propertySources.addFirst(dbPropertySource);
            }
            long endTime = System.nanoTime();
            // 计算加载配置文件的耗时
            double useTime = (endTime - startTime) / 1E9;
            System.out.println("数据库表配置-->读取数据表配置服务:结束,加载耗时:" + useTime + "秒!");
//            String key = env.getProperty("cachemanager_refresh_period").toString();
//            System.out.println("数据库表配置-->" + key);
        } catch (Exception e) {
            // 错误信息打印
            System.out.println("error");
            e.printStackTrace();
        }
    }
}